package main

import (
	"fmt"
	"math/rand"
	"time"
)

// 基于 Channel 编写一个简单的单线程生产者消费者模型：
// 队列：
// 队列长度 10，队列元素类型为 int
// 生产者：
// 每 1 秒往队列中放入一个类型为 int 的元素，队列满时生产者可以阻塞
// 消费者：
// 每一秒从队列中获取一个元素并打印，队列为空时消费者阻塞

func main() {
	ch := make(chan int, 10)
	go producer("001", ch)
	go producer("002", ch)
	go producer("003", ch)
	go producer("004", ch)
	go comsumer("001", ch)
	go comsumer("002", ch)

	select {}
}

func producer(name string, ch chan<- int) {
	for {
		v := rand.Intn(100)
		fmt.Printf("producer %s produce %d\n", name, v)
		ch <- v
		time.Sleep(time.Duration(300) * time.Millisecond)
	}
}

func comsumer(name string, ch <-chan int) {
	for v := range ch {
		fmt.Printf("comsumer %s receiving: %d \n", name, v)
	}
}
